﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ClienteWinMGI.Logica;
using ComunesMGI.DataTypes;
using System.Collections;
using ComunesMGI.Constantes;
using ComunesMGI.Mensajes;

namespace ClienteWinMGI.Presentacion
{
    public partial class GestionControl : UserControl
    {
        //ATRIBUTOS USADOS EN COMUN POR DIFERENTES TABS
        private List<DataCliente> _clientes;


        //ATRIBUTO USADO PARA EL TAB DE WORK WITH
        private List<DataWP> _workPackages;
        private List<DataSistema> _sistemasWP;

        //ATRIBUTOS USADOS PARA EL TAB DE TAREAS
        private List<DataSistema> _sistemasTareas;
        private List<DataIncidente> _incidentesTareas;

        private List<DataTarea> _tareas;

        public GestionControl()
        {
            InitializeComponent();
            cargarClientes();
        }

        public List<DataWP> WorkPackages
        {
            set { _workPackages = value; }
            get { return _workPackages; }
        }

        public void cargarClientes()
        {

            try
            {
                IClientes iClientes = LogicaFactory.getInstance().getIClientes();
                _clientes = iClientes.getClientes();
                cboCliente.Items.Clear();
                cboClienteTarea.Items.Clear();
                foreach (DataCliente dc in _clientes)
                {
                    cboCliente.Items.Add(dc.Nombre);
                    cboClienteTarea.Items.Add(dc.Nombre);

                }
                cboCliente.SelectedIndex = -1;
                cboClienteTarea.SelectedIndex = -1;
            }
            catch (Exception ex)
            {
                Error err = new Error("Error", "Error al cargar los clientes", ex.Message);
                err.ShowDialog();
            }

        }



        #region Incidentes

        private void buttonAgregar_Click(object sender, EventArgs e)
        {
            AltaIncidente _altaIncidente = new AltaIncidente();
            _altaIncidente.ShowDialog();
        }
        #endregion



        

     

        #region WorkPackages
        private void btnActualizar_Click(object sender, EventArgs e)
        {

            try
            {
                //me fijo si tengo seleccionado un cliente y un sistema
                if (cboCliente.SelectedIndex != -1 && cboSistema.SelectedIndex != -1)
                {
                    //OBTENGO EL SISTEMA SELECCIONADO
                    DataSistema actualDs = _sistemasWP.First(ds => ds.Nombre == cboSistema.SelectedItem.ToString());

                    DataTable datosTabla = obtenerDatosTabla(actualDs.Codigo);
                    dataGridWP.DataSource = datosTabla;

                }
                else
                {
                    Notificacion n = new Notificacion("Faltan datos", "Ingrese cliente y sistema", "debe seleccionar el cliente y el sistema");
                    n.ShowDialog();
                }
            }
            catch (Exception ex)
            {
                Error err = new Error("Error", "", ex.Message);
                err.ShowDialog();
            }
        }
        private DataTable obtenerDatosTabla(int idSis)
        {

            IIncidentes ii = LogicaFactory.getInstance().getIIncidentes();

            List<DataWP> listaWp = ii.getWorkPackages(idSis);
            _workPackages = listaWp;
            //creo el datatable para cargarselo despues como datasource de la grilla
            DataTable datosTabla = new DataTable("tablaWP");
            datosTabla.Columns.Add("Nombre", typeof(string));
            datosTabla.Columns.Add("Estado", typeof(string));
            string nombreWP;
            string estadoWP;


            foreach (DataWP dp in listaWp)
            {
                nombreWP = dp.Nombre;
                estadoWP = dp.Estado.Estado;
                DataRow dataR = datosTabla.NewRow();
                dataR[0] = nombreWP;
                dataR[1] = estadoWP;
                datosTabla.Rows.Add(dataR);

            }

            return datosTabla;
        }



        private void ActualizarGrillaWP()
        {
            if (cboCliente.SelectedIndex != -1 && cboSistema.SelectedIndex != -1)
            {
                //OBTENGO EL SISTEMA SELECCIONADO
                DataSistema actualDs = _sistemasWP.First(ds => ds.Nombre == cboSistema.SelectedItem.ToString());

                DataTable datosTabla = obtenerDatosTabla(actualDs.Codigo);
                dataGridWP.DataSource = datosTabla;

            }
            else
            {

                cboCliente.SelectedIndex = -1;
                cboSistema.SelectedIndex = -1;
                cboSistema.Items.Clear();
                cboSistema.Enabled = false;
                _workPackages = null;
                dataGridWP.DataSource = null;

            }

        }

        private void btnAgregar_Click(object sender, EventArgs e)
        {
            try
            {
                AltaWorkPackage altaWp = new AltaWorkPackage();
                altaWp.ShowDialog();
                ActualizarGrillaWP();
            }
            catch (Exception ex)
            {
                Error err = new Error("Error", "", ex.Message);
                err.ShowDialog();
            }
        }

        /// <summary>
        /// devuelve el indice en la lista de work packages del workpackage seleccionado, si es que se
        /// selecciono alguno, sino devuelve -1
        /// </summary>
        /// <returns>integer</returns>
        private int obtenerIndiceWPSeleccionado()
        {
            DataGridViewSelectedRowCollection col = dataGridWP.SelectedRows;
            bool salir = false;
            int i = 0;
            while (!salir && i < dataGridWP.RowCount)
            {
                DataGridViewRow fila = dataGridWP.Rows[i];
                if (col.Contains(fila))
                {
                    salir = true;

                }
                else
                {
                    i++;
                }
            }
            if (salir)
                return i;
            else
                return -1;
        }

        private void btnModificar_Click(object sender, EventArgs e)
        {
            try
            {
                if (cboSistema.SelectedIndex != -1)
                {
                    if (dataGridWP.DataSource == null)
                    {
                        Notificacion n = new Notificacion("Seleccione un work package", "Presione el boton de actualizar", " Presione el boton de actualizar para ver los Work Packages ");
                        n.ShowDialog();
                    }
                    else
                    {
                        int i = obtenerIndiceWPSeleccionado();
                        if (i >= 0)
                        {

                            DataWP datosWP = _workPackages.ElementAt(i);
                            ModificarWorkPackage modif = new ModificarWorkPackage(datosWP);
                            modif.ShowDialog();
                            ActualizarGrillaWP();
                        }
                        else
                        {
                            Error er = new Error("Error", "Debe seleccionar un Work Package", "Seleccione un Work Package para modificar");
                            er.ShowDialog();
                        }
                    }
                }
                else
                {
                    Error er = new Error("Error", "Debe seleccionar un sistema", "Seleccione un sistema y el boton de actualizar para poder ver los work packages y seleccionar uno");
                    er.ShowDialog();
                }
            }
            catch (Exception ex)
            {
                Error err = new Error("Error", "", ex.Message);
                err.ShowDialog();
            }
        }
        private void btnVisualizar_Click(object sender, EventArgs e)
        {
            try
            {
                if (cboSistema.SelectedIndex != -1)
                {
                    if (dataGridWP.DataSource == null)
                    {
                        Notificacion n = new Notificacion("Seleccione un work package", "", "Debe seleccionar un Work Package");
                        n.ShowDialog();
                    }
                    else
                    {
                        int i = obtenerIndiceWPSeleccionado();
                        if (i >= 0)
                        {

                            DataWP datosWP = _workPackages.ElementAt(i);

                            DataSistema actualDs = _sistemasWP.First(ds => ds.Nombre == cboSistema.SelectedItem.ToString());
                            VisualizarWP visualizar = new VisualizarWP(datosWP, actualDs.Codigo);
                            visualizar.ShowDialog();
                        }
                        else
                        {
                            Error er = new Error("Error", "Debe seleccionar un Work Package", "Seleccione un Work Package para visualizar");
                            er.ShowDialog();
                        }
                    }
                }
                else
                {
                    Error er = new Error("Error", "Debe seleccionar un sistema", "Seleccione un sistema para poder ver la informacion de un Work Package");
                    er.ShowDialog();
                }
            }
            catch (Exception ex)
            {
                Error err = new Error("Error", "", ex.Message);
                err.ShowDialog();
            }

        }

        private void btnAsignarInc_Click(object sender, EventArgs e)
        {
            try
            {
                int i = obtenerIndiceWPSeleccionado();
                if (i >= 0)
                {

                    DataWP datosWP = _workPackages.ElementAt(i);
                    DataSistema actualDs = _sistemasWP.First(ds => ds.Nombre == cboSistema.SelectedItem.ToString());
                    DataCliente actualDc = _clientes.First(dc => dc.Nombre == cboCliente.SelectedItem.ToString());
                    AsignarIncidentesWP asignacion = new AsignarIncidentesWP(actualDc.Codigo, actualDs.Codigo, datosWP);
                    asignacion.ShowDialog();
                }
                else
                {
                    Error er = new Error("Error", "Debe seleccionar un dato", "Para poder asignar incidentes a un workPackage debe seleccionar un work package de la lista");
                    er.ShowDialog();
                }
            }
            catch (Exception ex)
            {
                Error er = new Error("Error", "", ex.Message);
                er.ShowDialog();
            }

        }

        private void cboCliente_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                if (cboCliente.SelectedIndex != -1)
                {
                    //vacio el combo de los sistemas
                    cboSistema.Items.Clear();

                    //pido los sistemas
                    LogicaFactory fabrica = LogicaFactory.getInstance();
                    ISistemas sist = fabrica.getISistemas();

                    //obtengo los datos del cliente seleccionado
                    DataCliente actualDc = _clientes.First(dc => dc.Nombre == cboCliente.SelectedItem.ToString());

                    //pido los sistemas y los cargo en el combo
                    _sistemasWP = sist.getSistemas(actualDc.Codigo);
                    foreach (DataSistema ds in _sistemasWP)
                    {
                        string item = ds.Nombre;
                        cboSistema.Items.Add(item);
                    }
                    cboSistema.SelectedIndex = -1;
                    cboSistema.Enabled = true;

                    //vacio la grilla
                    dataGridWP.DataSource = null;


                }
                else
                {
                    cboSistema.Items.Clear();
                    cboSistema.SelectedIndex = -1;
                    dataGridWP.DataSource = null;
                }
            }
            catch (Exception ex)
            {
                Error err = new Error("Error", "", ex.Message);
                err.ShowDialog();
            }

        }

        private void cboSolucion_SelectedIndexChanged(object sender, EventArgs e)
        {
            //vacio la grilla
            dataGridWP.DataSource = null;
        }
        #endregion




        #region Tareas
        private void cboClienteTarea_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cboClienteTarea.SelectedIndex != -1)
            {
                //vacio el combo de los sistemas 
                cboSistemaTarea.Items.Clear();
                try
                {
                    //pido los sistemas
                    LogicaFactory fabrica = LogicaFactory.getInstance();
                    ISistemas sist = fabrica.getISistemas();

                    //obtengo los datos del cliente seleccionado
                    DataCliente actualDc = _clientes.First(dc => dc.Nombre == cboClienteTarea.SelectedItem.ToString());


                    //pido los sistemas y los cargo en el combo
                    _sistemasTareas = sist.getSistemas(actualDc.Codigo);
                    foreach (DataSistema ds in _sistemasTareas)
                    {

                        cboSistemaTarea.Items.Add(ds.Nombre);
                    }
                    cboSistemaTarea.SelectedIndex = -1;
                    cboSistemaTarea.Enabled = true;

                    //vacio la grilla de las tareas
                    grillaTareas.DataSource = null;

                }
                catch (Exception ex)
                {
                    Error err = new Error("Error", "Error al buscar los sistemas", ex.Message);
                    err.Show();
                }
            }

        }


        private int obtenerIndiceTareaSeleccionado()
        {
            DataGridViewSelectedRowCollection col = grillaTareas.SelectedRows;
            bool salir = false;
            int i = 0;
            while (!salir && i < grillaTareas.RowCount)
            {
                DataGridViewRow fila = grillaTareas.Rows[i];
                if (col.Contains(fila))
                {
                    salir = true;

                }
                else
                {
                    i++;
                }
            }
            if (salir)
                return i;
            else
                return -1;
        }

        private void cboSistemaTarea_SelectedIndexChanged(object sender, EventArgs e)
        {
            //vacio la grilla
            dataGridWP.DataSource = null;
            //lleno el combo de los incidentes
            if (cboSistemaTarea.SelectedIndex != -1)
            {
                cboIncidenteTarea.SelectedIndex = -1;
                cboIncidenteTarea.Items.Clear();


                DataSistema actualDs = _sistemasTareas.First(ds => ds.Nombre == cboSistemaTarea.SelectedItem.ToString());
                IIncidentes incidentes = LogicaFactory.getInstance().getIIncidentes();

                //guardo la lista de incidentes
                _incidentesTareas = incidentes.getIncidentes(actualDs.Codigo);

                //agrego los incidentes al combo
                for (int i = 0; i < _incidentesTareas.Count(); i++)
                {
                    string inc = "Id=" + _incidentesTareas[i].IdIncidente + ";" + "Desc=" + _incidentesTareas[i].Descripcion;
                    cboIncidenteTarea.Items.Add(inc);
                }
                cboIncidenteTarea.SelectedIndex = -1;
                cboIncidenteTarea.Enabled = true;

            }
        }



        private void cboIncidenteTarea_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cboIncidenteTarea.SelectedIndex != -1)
            {
                grillaTareas.DataSource = null;
            }
        }


        private void btnActualizarTarea_Click(object sender, EventArgs e)
        {
            try
            {
                if (cboClienteTarea.SelectedIndex != -1 && cboSistemaTarea.SelectedIndex != -1 && cboIncidenteTarea.SelectedIndex != -1)
                {
                    //en este caso es q voy a mostrar los datos q las tareas del incidente
                    IIncidentes ii = LogicaFactory.getInstance().getIIncidentes();
                    DataSistema actualDs = _sistemasTareas.First(ds => ds.Nombre == cboSistemaTarea.SelectedItem.ToString());


                    string datoIncidente = cboIncidenteTarea.SelectedItem.ToString();
                    char[] delimitador = { '=', ';' };
                    string[] palabras = datoIncidente.Split(delimitador);
                    int id = int.Parse(palabras[1]);
                    //obtengo la lista de tareas
                    _tareas = ii.GetTareas(actualDs.Codigo, id);

                    DataTable datosTabla = new DataTable("tablaTareas");
                    datosTabla.Columns.Add("Identificador", typeof(string));
                    datosTabla.Columns.Add("Descripcion", typeof(string));
                    string idT;
                    string desc;


                    foreach (DataTarea dt in _tareas)
                    {
                        idT = dt.IdTarea;
                        desc = dt.Descripcion;
                        DataRow dataR = datosTabla.NewRow();
                        dataR[0] = idT;
                        dataR[1] = desc;
                        datosTabla.Rows.Add(dataR);

                    }

                    grillaTareas.DataSource = datosTabla;

                }
                else
                {

                    Notificacion n = new Notificacion("Faltan datos", "Ingrese cliente, sistema, incidente", "Debe seleccionar el cliente, el sistema y el incidente");
                    n.ShowDialog();
                }
            }
            catch (Exception ex)
            {
                Error err = new Error("Error", "", ex.Message);
                err.ShowDialog();
            }
        }

        private void btnAsignarResp_Click(object sender, EventArgs e)
        {
            try
            {
                int i = obtenerIndiceTareaSeleccionado();
                if (i >= 0)
                {

                    DataTarea dTarea = _tareas.ElementAt(i);
                    DataSistema actualDs = _sistemasTareas.First(ds => ds.Nombre == cboSistemaTarea.SelectedItem.ToString());
                    string datoIncidente = cboIncidenteTarea.SelectedItem.ToString();
                    char[] delimitador = { '=', ';' };
                    string[] palabras = datoIncidente.Split(delimitador);
                    int id = int.Parse(palabras[1]);

                    AsignarResponsableATarea art = new AsignarResponsableATarea(actualDs.Codigo, id, dTarea);
                    art.ShowDialog();
                }
                else
                {
                    Error er = new Error("Error", "Debe seleccionar un dato", "Para poder asignar responsable a tarea debe seleccionar un cliente, sistema, incidente y tarea");
                    er.ShowDialog();
                }
            }
            catch (Exception ex)
            {
                Error er = new Error("Error", "", ex.Message);
                er.ShowDialog();
            }
        }



        #endregion



        

  
 
       
       
        
       
       
        private void dataGridViewIncidentes_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {

        }

      

        private void groupBox5_Enter(object sender, EventArgs e)
        {

        }

        #region Clientes

        private void ActualizarTablaClientes()
        {
            try
            {

                DataTable datosCliente = new DataTable("tablaClientes");
                datosCliente.Columns.Add("Nombre", typeof(string));
                if (txtNomCli.Text == "")
                {
                    foreach (DataCliente dc in _clientes)
                    {
                        DataRow dataR = datosCliente.NewRow();
                        dataR[0] = dc.Nombre;
                        datosCliente.Rows.Add(dataR);

                    }
                }
                else
                {
                    foreach (DataCliente dc in _clientes)
                    {
                        if (dc.Nombre.Contains(txtNomCli.Text))
                        {
                            DataRow dataR = datosCliente.NewRow();
                            dataR[0] = dc.Nombre;
                            datosCliente.Rows.Add(dataR);

                        }
                    }

                }
                grillaClientes.DataSource = datosCliente;
            }
            catch (Exception ex)
            {
                Error err = new Error("Error", "", ex.Message);
                err.ShowDialog();

            }

        
        }
        private void btnActualizarClientes_Click(object sender, EventArgs e)
        {

            ActualizarTablaClientes();
        }

        private void btnAgregarCli_Click(object sender, EventArgs e)
        {
            AltaCliente ac = new AltaCliente();
            ac.ShowDialog();
            cargarClientes();
            ActualizarTablaClientes();
        }
        #endregion

        private void button5_Click(object sender, EventArgs e)
        {

        }

       

       



        
    }
}
